using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;

namespace Boot
{
    /**
     * 游戏引导类 (Bootstrap)
     * 
     * 功能说明：
     * - 作为游戏的入口点，负责加载和初始化游戏主应用
     * - 使用Unity Addressable系统异步加载GameApp预制体
     * - 确保游戏主应用正确启动并设置为常驻对象
     * 
     * 工作流程：
     * 1. 游戏启动时，Bootstrap首先执行
     * 2. 通过Addressable系统加载GameApp预制体
     * 3. 实例化GameApp并开始游戏主流程
     */
    public class GameBootstrap : MonoBehaviour
    {
        /**
         * GameApp预制体的Addressable地址
         * 
         * 说明：
         * - 在Unity编辑器中可以修改此地址
         * - 默认指向Boot目录下的GameApp预制体
         * - 使用Addressable系统进行资源管理，支持热更新
         */
        [SerializeField]
        private string gameAppAddress = "Assets/Addressables/Boot/GameApp.prefab";

        /**
         * Unity生命周期：Start方法
         * 
         * 功能：
         * - 游戏启动时的初始化入口
         * - 开始异步加载GameApp预制体
         * - 使用协程方式处理异步加载，避免阻塞主线程
         */
        void Start()
        {
            // 打印启动日志，便于调试
            Debug.Log("Bootstrap Start - 游戏引导开始");

            // 启动协程，异步加载GameApp
            StartCoroutine(LoadGameApp());

            // 注释掉的回调方式加载代码
            // 说明：虽然也能工作，但协程方式更清晰，便于调试和错误处理
            // Addressables.LoadAssetAsync<GameObject>(gameAppAddress).Completed += (handle) =>
            // {
            //     // 如果加载成功，则实例化GameApp
            //     if (handle.Result != null)
            //     {
            //         // 实例化GameApp（加载回来的是prefab，需要实例化才能加入到场景中）
            //         Instantiate(handle.Result);

            //         // 打印日志
            //         Debug.Log("启动游戏");
            //     }
            //     else
            //     {
            //         Debug.LogError("启动失败：加载GameApp失败");
            //     }
            // };
        }

        /**
         * 异步加载GameApp预制体的协程方法
         * 
         * 功能：
         * - 使用Addressable系统异步加载GameApp预制体
         * - 加载成功后实例化GameApp对象
         * - 处理加载失败的错误情况
         * 
         * 返回值：IEnumerator - 协程迭代器
         */
        IEnumerator LoadGameApp()
        {
            // 使用Addressable系统异步加载GameApp预制体
            var handle = Addressables.LoadAssetAsync<GameObject>(gameAppAddress);
            
            // 等待加载完成
            yield return handle;

            // 检查加载结果
            if (handle.Result != null)
            {
                // 实例化GameApp预制体
                // 注意：Addressable加载的是预制体，需要实例化才能成为场景中的对象
                Instantiate(handle.Result);

                // 打印成功日志
                Debug.Log("Bootstrap: 游戏启动成功 - GameApp已加载并实例化");
            }
            else
            {
                // 加载失败，打印错误信息
                Debug.LogError("Bootstrap: 启动失败 - 无法加载GameApp预制体，请检查Addressable配置");
            }
        }
    }
}
